home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / PRINTERS / Pic.C < prev    next >
C/C++ Source or Header  |  1992-05-05  |  7KB  |  270 lines

  1. #include "Types.h"
  2. #include "Port.h"
  3. #include "Error.h"
  4. #include "String.h"
  5. #include "PrintPort.h"
  6. #include "Class.h"
  7. #include "Printer.h"
  8.  
  9. //---- PicPort -----------------------------------------------------------------
  10.  
  11. class PicPort: public PrintPort {    
  12.     FILE *pic;
  13.     float xscale;
  14.     int bcnt, lastfn, lastps;
  15.     Font *lbfont, *lfont;
  16.     byte bbuf[MaxTextBatchCnt];
  17.     
  18.     void PrintPenSize(int psz);
  19.     void PrintTextPs(int ps);
  20.     void PrintFont(Font *fp);
  21. public:
  22.  
  23.     PicPort(char *name= 0);
  24.     ~PicPort();
  25.     
  26.     void DevStrokeLine(int, Rectangle*, GrLineCap, Point, Point);
  27.     void DevShowBitmap(Rectangle*, struct Bitmap*);
  28.     void DevShowChar(Font *fdp, Point delta, byte c, Rectangle*);
  29.     void DevShowTextBatch(Rectangle*, Point);
  30.     void DevStrokeOval(int, Rectangle*);
  31.     void DevStrokeRRect(int, Rectangle*, Point);
  32.     void DevStrokeRect(int, Rectangle*);
  33.     void DevStrokeWedge(int, GrLineCap, Rectangle*, int, int);
  34.     void DevStrokePolygon(Rectangle*, Point*, int, GrPolyType, int, GrLineCap);
  35.     void DevGiveHint(int, int, void*);
  36.  
  37.     void DevOpenPage(int pn);
  38.     void DevClosePage();
  39. };
  40.  
  41. PicPort::PicPort(char *name) : PrintPort(name)
  42. {
  43.     lastfn= lastps= -99;
  44.     
  45.     xscale= 1.0;
  46.     
  47.     if (name == 0)
  48.     name= "pic";
  49.     
  50.     if ((pic= fopen(name, "w")) == NULL) {
  51.     Warning("PicPort", "can't open file %s; trying ./pic", name);
  52.     if ((pic= fopen("pic", "w")) == NULL)
  53.         Fatal("PicPort", "can't open file \"./pic\"");
  54.     }
  55. }
  56.  
  57. PicPort::~PicPort()
  58. {
  59.     fclose(pic);
  60. }
  61.  
  62. //---- Open, Close -------------------------------------------------------------
  63.  
  64. void PicPort::DevOpenPage(int)
  65. {
  66.     fprintf(pic, ".PS\n");
  67.     fprintf(pic, "scale = 72.0 * %.3f\n", xscale);
  68.     fprintf(pic, "dashwid = 4\n");
  69.     fprintf(pic, "define Bitmap X box dashed wid $3 ht $4 with .nw at $1,$2 X\n");
  70.     fprintf(pic, "define Text X $3 with .nw at $1,$2 ljust X\n");
  71.     fprintf(pic, "define Line X line $1 from $2,$3 to $4,$5 X\n");
  72.     fprintf(pic, "define Box X box wid $3 ht $4 with .nw at $1,$2 X\n");
  73.     fprintf(pic, "define Arc X arc $1 wid $4 ht $5 with .nw at $2,$3 X\n");
  74.     fprintf(pic, "define Ellipse X ellipse wid $3 ht $4 with .w at $1,$2-$4/2 X\n");
  75.     fprintf(pic, "define AL X line $2 $3-$1; $2; arc rad $1/2; X\n");
  76.     fprintf(pic, "define RBox X move to $1+$3,$2-$4+($5/2); AL($5,up,$4);AL($5,left,$3);AL($5,down,$4);AL($5,right,$3); X\n");
  77. }
  78.  
  79. void PicPort::DevClosePage()
  80. {
  81.     fprintf(pic, ".PE\n");
  82. }
  83.  
  84. //---- state -------------------------------------------------------------------
  85.  
  86. void PicPort::PrintPenSize(int psz)
  87. {
  88.     int ps= int(float(psz*24)/xscale+0.5);
  89.     if (ps != lastps)
  90.     fprintf(pic, ".ps %d\n", lastps= ps);
  91. }
  92.  
  93. void PicPort::PrintTextPs(int pps)
  94. {
  95.     int ps= int(float(pps)/xscale+0.5);
  96.     if (ps != lastps)
  97.     fprintf(pic, ".ps %d\n", lastps= ps);
  98. }
  99.  
  100. static char *Cap(GrLineCap cap)
  101. {
  102.     switch (cap) {
  103.     case eEndArrow:
  104.     return "->";
  105.     case eStartArrow:
  106.     return "<-";
  107.     case eEndArrow|eStartArrow:
  108.     return "<->";
  109.     default:
  110.     break;
  111.     }
  112.     return "";
  113. }
  114.  
  115. //---- graphic -----------------------------------------------------------------
  116.  
  117. void PicPort::DevStrokeLine(int psz, Rectangle *r, GrLineCap cap, Point p1, Point p2)
  118. {
  119.     Merge(r);
  120.     PrintPenSize(psz);
  121.     fprintf(pic, "Line(%s,%d,%d,%d,%d)\n", Cap(cap), p1.x, 700-p1.y, p2.x, 700-p2.y);
  122. }
  123.  
  124. static char *TroffFontTab[]= {
  125.     "R",    "B",    "I",    "D",
  126.     "TT",   "TB",   "TI",   "TD",
  127.     "H",    "HB",   "HI",   "HD",
  128.     0,
  129. };
  130.  
  131. void PicPort::PrintFont(Font *fp)
  132. {
  133.     int fn;
  134.     
  135.     switch (fp->Fid()) {
  136.     case eFontAvantgarde:
  137.     case eFontChicago:
  138.     case eFontHelvetica:
  139.     fn= 8;
  140.     break;
  141.     case eFontCourier:
  142.     fn= 4;
  143.     break;
  144.     case eFontTimes:
  145.     case eFontBookman:
  146.     case eFontPalatino:
  147.     default:
  148.     fn= 0;
  149.     break;
  150.     }
  151.     fn+= fp->Face() & (eFaceBold | eFaceItalic);
  152.     if (fn != lastfn)
  153.     fprintf(pic, ".ft %s\n", TroffFontTab[lastfn= fn]);
  154. }
  155.  
  156. static char *TroffChar(int c)
  157. {
  158.     static char st[2];
  159.     
  160.     switch (c) {
  161.     case '\"':
  162.     return "\\\"";
  163.     case '\\':
  164.     return "\\e";
  165.     }
  166.     st[0]= c;
  167.     st[1]= '\0';
  168.     return st;
  169. }
  170.  
  171. void PicPort::DevShowChar(Font *fdp, Point delta, byte c, Rectangle*)
  172. {
  173.     if (fdp != lfont || delta != gPoint0 || bcnt >= 200)
  174.     FlushAnyText();
  175.     
  176.     if (bcnt == 0)  // first
  177.     lfont= fdp;
  178.  
  179.     bbuf[bcnt++]= c;
  180. }
  181.  
  182. void PicPort::DevShowTextBatch(Rectangle *r, Point pos)
  183. {
  184.     Merge(r);
  185.     PrintTextPs(lfont->Size());
  186.     PrintFont(lfont);
  187.     
  188.     fprintf(pic, "Text(%d,%d,\"", pos.x, 700-pos.y);
  189.     for (int i= 0; i < bcnt; i++)
  190.     fprintf(pic, "%s", TroffChar(bbuf[i]));
  191.     fprintf(pic, "\")\n");
  192.     bcnt= 0;
  193.  
  194. void PicPort::DevShowBitmap(Rectangle *r, Bitmap*)
  195. {
  196.     Merge(r);
  197.     PrintTextPs(4);
  198.     fprintf(pic, "Bitmap(%d,%d,%d,%d)\n", r->origin.x, 700 - r->origin.y,
  199.                             r->extent.x, r->extent.y);
  200. }
  201.  
  202. void PicPort::DevStrokeOval(int psz, Rectangle *r)
  203. {
  204.     Merge(r);
  205.     PrintPenSize(psz);
  206.     fprintf(pic, "Ellipse(%d,%d,%d,%d)\n", r->origin.x, 700 - r->origin.y,
  207.                         r->extent.x, r->extent.y);
  208. }
  209.  
  210. void PicPort::DevStrokeRRect(int psz, Rectangle *r, Point dia)
  211. {
  212.     Merge(r);
  213.     PrintPenSize(psz);
  214.     fprintf(pic, "RBox(%d,%d,%d,%d,%d)\n", r->origin.x, 700 - r->origin.y,
  215.                         r->extent.x, r->extent.y, dia.x);
  216. }
  217.  
  218. void PicPort::DevStrokeRect(int psz, Rectangle *r)
  219. {
  220.     Merge(r);
  221.     PrintPenSize(psz);
  222.     fprintf(pic, "Box(%d,%d,%d,%d)\n", r->origin.x, 700 - r->origin.y,
  223.                         r->extent.x, r->extent.y);
  224. }
  225.  
  226. void PicPort::DevStrokeWedge(int psz, GrLineCap cap,
  227.                         Rectangle *r, int, int)
  228. {
  229.     Merge(r);
  230.     PrintPenSize(psz);
  231.     fprintf(pic, "Arc(%s,%d,%d,%d,%d)\n", Cap(cap), r->origin.x, 700 - r->origin.y,
  232.                     r->extent.x, r->extent.y);
  233. }
  234.  
  235. void PicPort::DevStrokePolygon(Rectangle *r, Point *pts,
  236.                 int npts, GrPolyType, int psz, GrLineCap)
  237. {
  238.     Merge(r);
  239.     PrintPenSize(psz);
  240.     fprintf(pic, "line from %d,%d ", r->origin.x+pts[0].x, r->origin.y+pts[0].y);
  241.     for (int i= 1; i < npts; i++)
  242.     fprintf(pic, "to %d,%d ", r->origin.x+pts[i].x, r->origin.y+pts[i].y);    
  243.     fprintf(pic, "\n");
  244. }
  245.  
  246. void PicPort::DevGiveHint(int code, int l, void *vp)
  247. {
  248.     if ((code == eHintPic) && (l > 0))
  249.     fprintf(pic, "%s", vp);
  250. }
  251.  
  252. //---- PicPrinter --------------------------------------------------------------
  253.  
  254. class PicPrinter : public Printer {
  255. public:
  256.     MetaDef(PicPrinter);
  257.     PicPrinter()
  258.     { }
  259.     char *GetName()
  260.     { return "Pic"; }
  261.     PrintPort *MakePrintPort(char *name)
  262.     { return new PicPort(name); }
  263.     bool CanSave()
  264.     {  return TRUE; }
  265. };
  266.  
  267. NewMetaImpl0(PicPrinter, Printer);
  268.  
  269.